package py.una.pol.pweb.compraventa.jsfs;

import py.una.pol.pweb.compraventa.modelos.Compra;
import py.una.pol.pweb.compraventa.jsfs.util.JsfUtil;
import py.una.pol.pweb.compraventa.jsfs.util.PaginationHelper;
import py.una.pol.pweb.compraventa.ejbs.CompraFacade;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import py.una.pol.pweb.compraventa.ejbs.CompradetalleFacade;
import py.una.pol.pweb.compraventa.ejbs.ProductoFacade;
import py.una.pol.pweb.compraventa.modelos.Compradetalle;
import py.una.pol.pweb.compraventa.modelos.Producto;
import py.una.pol.pweb.compraventa.modelos.Proveedor;

@ManagedBean(name = "compraController")
@SessionScoped
public class CompraController implements Serializable {

    private Compra current= new Compra();
    private DataModel items = null;
    @EJB
    private py.una.pol.pweb.compraventa.ejbs.CompraFacade ejbFacade;
    @EJB
    private py.una.pol.pweb.compraventa.ejbs.CompradetalleFacade compradetallefacade;
    @EJB
    private py.una.pol.pweb.compraventa.ejbs.ProductoFacade productofacade;
    private PaginationHelper pagination;
    private int selectedItemIndex;
    private Proveedor proveedorSelected=new Proveedor();
    private Producto productoSelected= new Producto();
    private double cantidadAComprar = 0;
    Producto productoAComprar;
    List<Producto> listaAComprar = new ArrayList<Producto>();
    
    Producto productoAComprarSelected;
    List<Compradetalle> compraDetalleRealizado;

    public CompradetalleFacade getCompradetallefacade() {
        return compradetallefacade;
    }

    public ProductoFacade getProductofacade() {
        return productofacade;
    }

    public Producto getProductoAComprar() {
        return productoAComprar;
    }

    public void setProductoAComprar(Producto productoAComprar) {
        this.productoAComprar = productoAComprar;
    }

    public List<Producto> getListaAComprar() {
        return listaAComprar;
    }

    public void setListaAComprar(List<Producto> listaAComprar) {
        this.listaAComprar = listaAComprar;
    }

    public Producto getProductoAComprarSelected() {
        return productoAComprarSelected;
    }

    public void setProductoAComprarSelected(Producto productoAComprarSelected) {
        this.productoAComprarSelected = productoAComprarSelected;
    }

    public double getCantidadAComprar() {
        return cantidadAComprar;
    }

    public void setCantidadAComprar(double cantidadAComprar) {
        this.cantidadAComprar = cantidadAComprar;
    }
    

    public Producto getProductoSelected() {
        return productoSelected;
    }

    public void setProductoSelected(Producto productoSelected) {
        this.productoSelected = productoSelected;
    }



    public Compra getCurrent() {
        return current;
    }

    public void setCurrent(Compra current) {
        this.current = current;
    }

    public Proveedor getProveedorSelected() {
        return proveedorSelected;
    }

    public void setProveedorSelected(Proveedor proveedorSelected) {
        this.proveedorSelected = proveedorSelected;
    }
    
    

    public CompraController() {
    }

    public Compra getSelected() {
        if (current == null) {
            current = new Compra();
            selectedItemIndex = -1;
        }
        return current;
    }

    private CompraFacade getFacade() {
        return ejbFacade;
    }

    public void eliminarProductoAComprar() {

        List<Producto> aux = new ArrayList<Producto>();
        Iterator it = listaAComprar.iterator();
        while (it.hasNext()) {

            Producto element = (Producto) it.next();
            if (productoAComprarSelected != null) {
                if (element.getIdproducto() != productoAComprarSelected.getIdproducto()) {
                    //listaAVender.remove(element);
                    //break;
                    aux.add(element);
                    FacesContext context = FacesContext.getCurrentInstance();

                } else {
                }

            } else {
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("no se selecciono registro", "Se agregó el producto al carrito"));
            }


        }
        listaAComprar = aux;



    }
    
        public void confirmarProductoAComprar(){
    

        FacesContext context = FacesContext.getCurrentInstance();
        try{
            //código para actualizar el saldo del cliente y el stock del producto
            compraDetalleRealizado=new ArrayList<Compradetalle>();    
            
            if (proveedorSelected.getIdproveedor()==null){
                throw new Exception();
            }
            
            current= new Compra();
            current.setIdproveedor(proveedorSelected);
            current.setNrofactura("");
            Calendar c1 = Calendar.getInstance();
            current.setFecha(c1.getTime());
            
            
            //Proveedor userx =  compradetallefacade.find(proveedorSelected);
            
            for (Producto elemento:listaAComprar){
            
                //userx.setSaldo(userx.getSaldo()+(elemento.getCantidad()*elemento.getPrecioventa()));
                Producto productox=productofacade.find(elemento.getIdproducto());
                productox.setCantidad(productox.getCantidad()+elemento.getCantidad());
                Compradetalle compradetallex=new Compradetalle();
                compradetallex.setIdproducto(productox);
                
                compradetallex.setIdcompra(current);
                compradetallex.setCantidad(cantidadAComprar);
                compradetallex.setObservaciones("");
                compradetallex.setPreciocompra(productox.getPreciocompra());
                
                compradetallex.setPrecioventa(productox.getPrecioventa());
                //compradetallefacade.create(compradetallex);
                compraDetalleRealizado.add(compradetallex);
                productofacade.edit(productox);
            
            }
            current.setCompradetalleCollection(compraDetalleRealizado);
                        
            create();
            proveedorSelected = new Proveedor();
            
            context.addMessage(null, new FacesMessage("Se registró la compra correctamente", "agregado correctamete."));


            
        }catch (Exception e){
            
            context.addMessage(null, new FacesMessage("Ocurrió un error al registrar la compra", "agregado correctamete."));
        
        }finally{
            //em.close();
        }
    
    
    }        

    
    public void agregarProductoAComprar() {

        productoAComprar = new Producto();
        productoAComprar.setIdproducto(productoSelected.getIdproducto());
        productoAComprar.setNombre(productoSelected.getNombre());
        productoAComprar.setDescripcion(productoSelected.getNombre());
        productoAComprar.setPreciocompra(productoSelected.getPreciocompra());
        productoAComprar.setPrecioventa(productoSelected.getPrecioventa());
        productoAComprar.setCantidad((int)cantidadAComprar);
        Iterator iter = listaAComprar.iterator();
        boolean existe = false;
        //listaAComprar.add(productoAComprar);

        while (iter.hasNext()) {
            Producto productoActual = (Producto) iter.next();
            System.out.println(productoAComprar.getNombre());
            if (productoActual.getIdproducto() == productoAComprar.getIdproducto()) {

                existe = true;
                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage("Error", "Ya se cargo este producto, elimine de la lista para cambiar"));

            }
        }
        if (existe == false) {
            //if (cantidadAComprar > productoSelected.getCantidad()) {
            //listaAComprar.add(productoAComprar);
            //FacesContext context = FacesContext.getCurrentInstance();
            //context.addMessage(null, new FacesMessage("No hay suficiente cantidad del producto", "Se agregó el producto al carrito"));
            //} else {
            listaAComprar.add(productoAComprar);
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage("Exito", "Se agregó el producto al carrito"));
            //}


        }

    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {
                @Override
                public int getItemsCount() {
                    return getFacade().count();
                }

                @Override
                public DataModel createPageDataModel() {
                    return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}));
                }
            };
        }
        return pagination;
    }

    public String prepareList() {
        recreateModel();
        return "List";
    }

    public String prepareView() {
        current = (Compra) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "View";
    }

    public String prepareCreate() {
        current = new Compra();
        selectedItemIndex = -1;
        return "Create";
    }

    public String create() {
        try {
            getFacade().create(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("CompraCreated"));
            return prepareCreate();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String prepareEdit() {
        current = (Compra) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "Edit";
    }

    public String update() {
        try {
            getFacade().edit(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("CompraUpdated"));
            return "View";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String destroy() {
        current = (Compra) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        performDestroy();
        recreatePagination();
        recreateModel();
        return "List";
    }

    public String destroyAndView() {
        performDestroy();
        recreateModel();
        updateCurrentItem();
        if (selectedItemIndex >= 0) {
            return "View";
        } else {
            // all items were removed - go back to list
            recreateModel();
            return "List";
        }
    }

    private void performDestroy() {
        try {
            getFacade().remove(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("CompraDeleted"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    private void updateCurrentItem() {
        int count = getFacade().count();
        if (selectedItemIndex >= count) {
            // selected index cannot be bigger than number of items:
            selectedItemIndex = count - 1;
            // go to previous page if last page disappeared:
            if (pagination.getPageFirstItem() >= count) {
                pagination.previousPage();
            }
        }
        if (selectedItemIndex >= 0) {
            current = getFacade().findRange(new int[]{selectedItemIndex, selectedItemIndex + 1}).get(0);
        }
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

    private void recreateModel() {
        items = null;
    }

    private void recreatePagination() {
        pagination = null;
    }

    public String next() {
        getPagination().nextPage();
        recreateModel();
        return "List";
    }

    public String previous() {
        getPagination().previousPage();
        recreateModel();
        return "List";
    }

    public SelectItem[] getItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), false);
    }

    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
    }

    @FacesConverter(forClass = Compra.class)
    public static class CompraControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            CompraController controller = (CompraController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "compraController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.lang.Integer getKey(String value) {
            java.lang.Integer key;
            key = Integer.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Integer value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Compra) {
                Compra o = (Compra) object;
                return getStringKey(o.getIdcompra());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Compra.class.getName());
            }
        }
    }
}
